//
//  UserAccountViewModel.swift
//  新浪微博
//
//  Created by 焦林生 on 15/11/8.
//  Copyright © 2015年 焦林生. All rights reserved.
//

import Foundation

/// 用户账号视图模型 - 没有父类
/**
模型通常继承自 NSObject -> 可以使用 KVC 设置属性，简化对象构造
如果没有父类，所有的内容，都需要从头创建，量级更轻

视图模型的作用：封装`业务逻辑`，通常没有复杂的属性
*/
//用户账户视图模型
class UserAccountViewModel {
    
    //用户模型
    var userAccount: UserAccount?
    
    //用户登录标记(计算性属性)
    var userLogin: Bool {
        
        //1 如果token有值 说明登录成功
        //2 如果没有过期 说明登录有效
        return (userAccount?.access_token != nil) && !isExpired
    }
    
    //用户账户视图模型单例
    static let sharedUserAccount = UserAccountViewModel()
    
    //返回有效的token
    var accessToken: String? {
    
        //如果token没有过期  返回account中的token属性
        if !isExpired {
        
            return userAccount?.access_token
        }
        return nil
    }
    //头像URL
    var avatarUrl: NSURL {
    
        return NSURL(string: userAccount?.avatar_large ?? "")!
    }
    
    
    // 归档保存的路径 - 计算型属性(类似于有返回值的函数，可以让调用的时候，语义会更清晰)
    /// 如果在 OC 中，可以通过只读属性／函数的方式实现
    private var accountPath: String {
    
        let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last!
        return (path as NSString).stringByAppendingPathComponent("account.plist")
    }
    //token过期处理
    private var isExpired: Bool {
    //判断用户账户过期日期与当前系统日期'进行比较',如果晚于当前系统 比较结果为降序
        // 自己改写日期，测试逻辑是否正确，创建日期的时候，如果给定 负数，返回比当前时间早的日期
        // account?.expiresDate = NSDate(timeIntervalSinceNow: -3600)
        
        // 如果 account 为 nil，不会调用后面的属性，后面的比较也不会继续...
        if userAccount?.expiresDate?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
        
            //代码执行到此 一定进行过比较
            return false
        }
        //如果过期返回true
        return true
    }
    
    // MARK: 构造函数
    //在init()之前增加private,会限制只允许通过单例访问对象
    private init() {
    
        //从沙盒加载用户账户信息
        userAccount = NSKeyedUnarchiver.unarchiveObjectWithFile(accountPath) as? UserAccount
        //如果账号已经过期,清空账号,要求用户重新登录
        if isExpired {
        
            userAccount = nil
        }
    }
    
    
}

//MARK: 用户账户相关的网络方法
/**
*  代码重构的步骤
    1 新方法
    2 粘贴代码
    3 根据上下文调整参数和返回值
    4 移动其他'子'方法
*/

extension UserAccountViewModel {

    /**
    加载accesstoken
    
    - parameter code:     授权码
    - parameter finished: 回调(是否成功)
    */
    func loadAccessToken(code: String, finished: (isSuccessed: Bool) ->()) {
    
    //4 加载accessToken
        NetworkTools.sharedTools.loadAccessToken(code) { (result, error) -> () in
            
            // 1> 判断错误
            if error != nil {
                finished(isSuccessed: false)
                return
            }
            
            // 2> 创建用户账户
            self.userAccount = UserAccount(dict: result as! [String: AnyObject])
            
            //3>加载账户信息
            self.loadUserInfo(self.userAccount!, finished: finished)
        }

    }
    
    /**
    加载用户信息
    
    - parameter account: 用户账户
    */
    private func loadUserInfo(account: UserAccount,finished: (isSuccess: Bool) -> ()) {
        
        NetworkTools.sharedTools.loadUserInfo(account.uid!) { (result, error) -> () in
            
            if error != nil {
                
                finished(isSuccess: false)
                
                return
            }
            // 提示：如果使用 if let / guard let 统统使用 `?`
            // 作了两个判断
            // 1. result 一定有内容
            // 2. 一定是字典
            guard let dict = result as? [String: AnyObject] else {
                
                finished(isSuccess: false)
                return
            }
            //dict 一定是一个有值的字典
            // 将用户信息保存
            account.screen_name = dict["screen_name"] as? String
            account.avatar_large = dict["avatar_large"] as? String
            
            //保存对象  会调用对象的encodewithcode方法
            NSKeyedArchiver.archiveRootObject(account, toFile: self.accountPath)
            
            
            finished(isSuccess: true)
        }
    }
}







